; 合并程序：先显示位图图标，然后显示动画
include c7.mac       ; 包含宏定义文件（包含cursor等宏）


;============ 数据段定义 ============
data segment
init db 0,0,4fh        ; 初始化参数: 起始行(0), 起始列(0), 颜色属性(4Fh)

; 位图转换后的字符阵列
bitmap_s db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh  ;5行
         db 12 dup(0DBh),8 dup(20h),12 dup(0DBh),0FFh
         db 10 dup(0DBh),12 dup(20h),10 dup(0DBh),0FFh
         db 10 dup(0DBh),12 dup(20h),10 dup(0DBh),0FFh
         db 7 dup(0DBh),20h,3 dup(0DBh),10 dup(20h),3 dup(0DBh),20h,7 dup(0DBh),0FFh
         db 6 dup(0DBh),20h,20h,3 dup(0DBh),4 dup(20h),0DBh,0DBh,4 dup(20h),3 dup(0DBh),20h,20h,6 dup(0DBh),0FFh
         db 5 dup(0DBh),4 dup(20h),3 dup(0DBh),3 dup(20h),4 dup(0DBh),20h,3 dup(0DBh),4 dup(20h),5 dup(0DBh),0FFh 
         db 5 dup(0DBh),4 dup(20h),3 dup(0DBh),3 dup(20h),8 dup(0DBh),4 dup(20h),5 dup(0DBh),0FFh
         db 4 dup(0DBh),5 dup(20h),3 dup(0DBh),3 dup(20h),8 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),5 dup(20h),5 dup(0DBh),20h,8 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),6 dup(20h),4 dup(0DBh),20h,3 dup(0DBh),20h,4 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),6 dup(20h),4 dup(0DBh),20h,2 dup(0DBh),3 dup(20h),2 dup(0DBh),6 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),24 dup(20h),4 dup(0DBh),0FFh ;中间行
         db 4 dup(0DBh),6 dup(20h),3 dup(0DBh),20h,20h,3 dup(0DBh),20h,20h,3 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),5 dup(20h),5 dup(0DBh),20h,3 dup(0DBh),20h,20h,3 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 4 dup(0DBh),5 dup(20h),5 dup(0DBh),20h,3 dup(0DBh),20h,20h,3 dup(0DBh),5 dup(20h),4 dup(0DBh),0FFh
         db 5 dup(0DBh),4 dup(20h),5 dup(0DBh),20h,3 dup(0DBh),20h,20h,3 dup(0DBh),4 dup(20h),5 dup(0DBh),0FFh
         db 5 dup(0DBh),4 dup(20h),3 dup(0DBh),20h,0DBh,20h,8 dup(0DBh),4 dup(20h),5 dup(0DBh),0FFh
         db 6 dup(0DBh),20h,20h,3 dup(0DBh),4 dup(20h),4 dup(0DBh),20h,20h,4 dup(0DBh),20h,20h,6 dup(0DBh),0FFh
         db 7 dup(0DBh),20h,3 dup(0DBh),4 dup(20h),4 dup(0DBh),20h,20h,3 dup(0DBh),20h,7 dup(0DBh),0FFh
         db 11 dup(0DBh),10 dup(20h),11 dup(0DBh),0FFh
         db 10 dup(0DBh),12 dup(20h),10 dup(0DBh),0FFh
         db 11 dup(0DBh),10 dup(20h),11 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh
         db 32 dup(0DBh),0FFh  ;5行
db 00               ; 结束标记

well_col db ?       ; 保存起始列位置
mess0 db 'Liaoning Normal University. ' 
mess1 db '$'
m_row db 6	
m_col db 30
m_width dw ?
cont1 dw ?
cont2 dw ?
data ends              
;============ 代码段定义 ============
code segment
   assume cs:code,ds:data

; 子程序：显示位图块
graph_block proc near    
write:           
    mov al,[si]
    inc si
    cmp al,0ffh
    je  next1
    cmp al,0
    jz  exit
    
    mov ah,9
    mov bh,0
    mov cx,1
    int 10h        ; 显示字符
    
    inc dl
    cursor dh,dl   ; 移动光标
    jmp write
                       
next1:
    inc dh
    mov dl,well_col
    cursor dh,dl
    jmp write

exit:
    ret
graph_block endp

; 子程序：字符移动动画
m_move proc near
mov cx,m_width			;移动次数
mov cont2,cx
mov cont1,cx
let1:					 ;循环左移一串字符
delay

cursor m_row,m_col		;在6行30列
show_c mess0[di],7ch	  ;显示字母，红色字
mov dl,m_col
inc dl
cursor m_row,dl

displd 20h				;消隐
dec m_col				 ;左移光标
dec cont1
jnz let1				  ;一个字符移动
mov m_col,30
inc di					;取下一个字符
sub cont2,1
mov bx,cont2
mov cont1,bx
jnz let1		
ret
m_move endp     

; 主程序
start:
    mov ax,data
    mov ds,ax
    
    ; === 第一部分：显示位图图标 ===
    mov si,0
    clearsc              ; 清屏
    
    mov si,offset init
    mov dh,[si]          ; 起始行
    inc si
    mov dl,[si]          ; 起始列
    mov well_col,dl
    inc si
    mov bl,[si]          ; 颜色属性
    
    cursor dh,dl         ; 设置初始光标位置
    mov si,offset bitmap_s
    call graph_block     ; 显示位图
    
    ; 等待按键
    cursor 20,0          ; 将光标移至屏幕下方
    mov ah,1
    int 21h              ; 等待按键
    
    ; === 第二部分：显示动画 ===
    mov di,0
    mov bx, offset mess1 - offset mess0 ; 计算字符串长度
    mov m_width,bx
    
    ; 设置动画位置（调整到屏幕下方）
    mov m_row, 3        ; 第3行
    mov m_col, 30  		;获得字串长度
    call m_move			   ;调用字串移动子程序
    mov ah,0				  ;设置返回后显示模式
    mov al,03h				;80*25,16色标准文本模式
    int 10h       ; 第30列

    ; 退出程序
    mov ah,4ch
    int 21h                         
code ends
end start